package com.samp.concurrent;

/**
 * 创建一个线程，不考虑线程池，大概有三种方法。
 * 一：继承Thread
 * 二：实现Runnable
 * 三：匿名类
 * 前面两种方法适合我们需要多个线程，去完成相同的任务，第三种方法适合我们需要完成一件事，但不影响主流程的情况。
 * 要注意的是，类RunnableA即使实现了Runnable接口，我们启线程的时候，也不能RunnableA a = new RunnableA();a.run()
 * 这样不会创建多个线程，还是只能将其作为参数创建Thread对象，然后调用start()方法。
 */
public class CreateThread {
    public static void main(String[] args){
        ThreadA a = new ThreadA(5);
        ThreadA b = new ThreadA(8);
        a.start();
        b.start();
        Thread ra = new Thread(new RunnableA());
        Thread rb = new Thread(new RunnableA());
        ra.start();
        rb.start();
        Thread c = new Thread(new Runnable() {
            public void run() {
                System.out.println("这个线程只启动一次。");
            }
        });
        c.start();

        System.out.println("done");
    }
}

class ThreadA extends Thread{

    ThreadA(Integer loopNum){
        this.setLoopNum(loopNum);
    }
    private Integer loopNum;

    private Integer getLoopNum() {
        return loopNum;
    }

    private void setLoopNum(Integer loopNum) {
        this.loopNum = loopNum;
    }

    @Override
    public void run() {
        for( int i = 0 ; i < this.getLoopNum(); i++ ){
            System.out.println(this.getName()+" print times:"+i);
        }
    }
}

class RunnableA implements Runnable{
    public void run() {
        System.out.println("I implement Runnable.");
    }
}
